// 泛型定义一个函数
// function log<T>(value: T): T {
//   console.log(value);
//   return value;
// }
// log<string[]>(["a", ",b", "c"]);
// log(["a", ",b", "c"]); // 使用ts的类型推断

// 泛型定义一个类型别名
// type Log = <T>(value: T) => T
// let myLog: Log = log

// 泛型定义一个接口
// interface Log {
//   <T>(value: T): T;  // 泛型约束一个函数
// }
// interface Log<T> { // 泛型约束其他成员
//     (value: T): T
// }
// let myLog: Log<number> = log // 实现的时候指定一个类型
// myLog(1)

// 指定泛型参数的默认类型
// interface Log<T = string> {
//   (value: T): T;
// }
// let myLog: Log = log;
// myLog("1");

// 泛型类
class Log<T> {
  run(value: T) {
    console.log(value);
    return value;
  }
}
let log1 = new Log<number>();
log1.run(1);
let log2 = new Log(); // 不指定泛型参数时，则类型值可以为任意类型
log2.run({ a: 1 });

// 泛型约束
interface Length {
  length: number;
}
function log<T extends Length>(value: T): T {
  console.log(value, value.length);
  return value;
}
log([1]);
log("123");
log({ length: 1 });
// interface Length {
//   length: number;
// }
// function logAdvance<T extends Length>(value: T): T {
//   console.log(value, value.length);
//   return value;
// }
// logAdvance([1]);
// logAdvance("123");
// logAdvance({ length: 3 });
